package com.zjcloud.jwgl.mapper;

import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.zjcloud.jwgl.domain.AcScheduleConstraint;

/**
 * 排课约束条件Mapper接口
 * 
 * @author zjcloud
 * @date 2024-01-01
 */
public interface AcScheduleConstraintMapper 
{
    /**
     * 查询排课约束条件
     * 
     * @param id 排课约束条件主键
     * @return 排课约束条件
     */
    public AcScheduleConstraint selectAcScheduleConstraintById(@Param("id") Long id);

    /**
     * 查询排课约束条件列表
     * 
     * @param acScheduleConstraint 排课约束条件
     * @return 排课约束条件集合
     */
    public List<AcScheduleConstraint> selectAcScheduleConstraintList(AcScheduleConstraint acScheduleConstraint);

    /**
     * 根据学校ID查询约束条件列表
     * 
     * @param schoolId 学校ID
     * @return 排课约束条件集合
     */
    public List<AcScheduleConstraint> selectConstraintsBySchoolId(@Param("schoolId") Long schoolId);

    /**
     * 根据约束类型ID查询约束条件列表
     * 
     * @param constraintTypeId 约束类型ID
     * @return 排课约束条件集合
     */
    public List<AcScheduleConstraint> selectConstraintsByTypeId(@Param("constraintTypeId") Long constraintTypeId);

    /**
     * 查询启用的约束条件列表
     * 
     * @param schoolId 学校ID
     * @return 排课约束条件集合
     */
    public List<AcScheduleConstraint> selectEnabledConstraints(@Param("schoolId") Long schoolId);

    /**
     * 根据学期查询约束条件列表
     * 
     * @param semester 学期
     * @return 排课约束条件集合
     */
    public List<AcScheduleConstraint> selectConstraintsBySemester(@Param("semester") String semester);

    /**
     * 新增排课约束条件
     * 
     * @param acScheduleConstraint 排课约束条件
     * @return 结果
     */
    public int insertAcScheduleConstraint(AcScheduleConstraint acScheduleConstraint);

    /**
     * 修改排课约束条件
     * 
     * @param acScheduleConstraint 排课约束条件
     * @return 结果
     */
    public int updateAcScheduleConstraint(AcScheduleConstraint acScheduleConstraint);

    /**
     * 删除排课约束条件
     * 
     * @param id 排课约束条件主键
     * @return 结果
     */
    public int deleteAcScheduleConstraintById(@Param("id") Long id);

    /**
     * 批量删除排课约束条件
     * 
     * @param ids 需要删除的排课约束条件主键集合
     * @return 结果
     */
    public int deleteAcScheduleConstraintByIds(@Param("ids") Long[] ids);
    
    /**
     * 检查约束条件名称是否唯一
     * 
     * @param name 约束条件名称
     * @param schoolId 学校ID
     * @return 结果
     */
    public int checkConstraintNameUnique(@Param("name") String name, @Param("schoolId") Long schoolId);

    /**
     * 检查约束条件名称是否唯一(排除指定ID)
     * 
     * @param name 约束条件名称
     * @param schoolId 学校ID
     * @param id 排除的ID
     * @return 结果
     */
    public int checkConstraintNameUniqueExcludeId(@Param("name") String name, @Param("schoolId") Long schoolId, @Param("id") Long id);

    /**
     * 更新约束条件状态
     * 
     * @param id 约束条件ID
     * @param enabled 启用状态
     * @return 结果
     */
    public int updateConstraintStatus(@Param("id") Long id, @Param("enabled") String enabled);

    /**
     * 批量更新约束条件状态
     * 
     * @param ids 约束条件ID数组
     * @param enabled 启用状态
     * @return 结果
     */
    public int batchUpdateConstraintStatus(@Param("ids") Long[] ids, @Param("enabled") String enabled);
    
    /**
     * 更新约束权重
     *
     * @param id 约束条件ID
     * @param weight 权重
     * @return 结果
     */
    public int updateConstraintWeight(@Param("id") Long id, @Param("weight") Integer weight);

    /**
     * 批量更新约束权重
     *
     * @param constraints 约束条件列表(包含ID和权重)
     * @return 结果
     */
    public int batchUpdateConstraintWeights(List<AcScheduleConstraint> constraints);

    /**
     * 根据学期删除约束条件
     *
     * @param semester 学期
     * @return 结果
     */
    public int deleteConstraintsBySemester(@Param("semester") String semester);

    /**
     * 根据学校ID删除约束条件
     *
     * @param schoolId 学校ID
     * @return 结果
     */
    public int deleteConstraintsBySchoolId(@Param("schoolId") Long schoolId);
    
    /**
     * 根据约束类型ID和学期查询约束条件
     *
     * @param constraintTypeId 约束类型ID
     * @param semester 学期
     * @return 约束条件
     */
    public AcScheduleConstraint selectByTypeAndSemester(@Param("constraintTypeId") Long constraintTypeId, @Param("semester") String semester);

    /**
     * 批量新增约束条件
     *
     * @param constraints 约束条件列表
     * @return 结果
     */
    public int batchInsertAcScheduleConstraint(List<AcScheduleConstraint> constraints);

    /**
     * 批量更新约束条件
     *
     * @param constraints 约束条件列表
     * @return 结果
     */
    public int batchUpdateAcScheduleConstraint(List<AcScheduleConstraint> constraints);

    /**
     * 根据约束类型ID统计约束条件数量
     *
     * @param constraintTypeId 约束类型ID
     * @return 统计结果
     */
    public int countConstraintsByTypeId(@Param("constraintTypeId") Long constraintTypeId);

    /**
     * 根据学校ID统计约束条件数量
     *
     * @param schoolId 学校ID
     * @return 统计结果
     */
    public int countConstraintsBySchoolId(@Param("schoolId") Long schoolId);
}